﻿// Fill out your copyright notice in the Description page of Project Settings.


#include "Character/PlayerCharacter.h"

#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/SpringArmComponent.h"


APlayerCharacter::APlayerCharacter()
{
	PrimaryActorTick.bCanEverTick = true;
	//玩家角色添加标签为玩家
	Tags.Add(FName("Player"));
	//加载摄像机摇臂组件
	CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
	//添加摇臂组件到角色胶囊体组件中
	CameraBoom->SetupAttachment(GetCapsuleComponent());
	/*
	 * 绝对旋转，在蓝图中设置旋转
	 * 作用：控制弹簧臂的旋转是否相对于世界坐标系（绝对旋转）或相对于父组件（相对旋转）
	 * 参数：bool bInAbsoluteRotation，true 表示使用绝对旋转，false 表示使用相对旋转。
	 * 绝对旋转（true）：
	 ** 弹簧臂的旋转不受父组件旋转的影响，始终相对于世界坐标系。
	 **	适用于需要固定视角的场景，例如第三人称摄像机。
	 * 相对旋转（false）
	 ** 弹簧臂的旋转会继承父组件的旋转。
	 ** 适用于需要跟随父组件旋转的场景，例如角色移动时摄像机跟随角色旋转
	*/
	CameraBoom->SetUsingAbsoluteRotation(true);
	//不使用碰撞检测
	CameraBoom->bDoCollisionTest = false;
	//设置弹簧臂的旋转角度
	CameraBoom->SetRelativeRotation(FRotator(-35.0f, -90.0f, 0.0f));
	//设置弹簧臂的缩放比例
	CameraBoom->TargetArmLength = 1200.0f;

	//设置相机组件
	TopDownCameraComponent = CreateDefaultSubobject<UCameraComponent>("TopDownCameraComponent");
	//将相机组件设置到相机摇臂组件的子对象，：SocketName 是弹簧臂组件默认的插槽名称，用于将其他组件（如摄像机）附加到弹簧臂的末端
	//SocketName 的值通常是 "SpringEndpoint"，表示弹簧臂的末端位置
	TopDownCameraComponent->SetupAttachment(CameraBoom, USpringArmComponent::SocketName);
	/*
	 * bUsePawnControlRotation 是 Unreal Engine 中 UCameraComponent 类的一个布尔属性，
	 * 用于控制摄像机是否跟随玩家控制器（Player Controller）的旋转
	 * 功能
	 ** 作用：决定摄像机是否根据玩家控制器的输入（如鼠标或手柄）进行旋转。
	 ** 默认值：true，表示摄像机会跟随玩家控制器的旋转。
	 ** 设置为 false：摄像机不会跟随玩家控制器的旋转，保持固定方向。
	 * 使用场景
	 ** 第三人称摄像机：
	 *** 通常设置为 false，因为第三人称摄像机需要独立于玩家控制器的旋转，保持固定的视角。
	 *** 例如，角色移动时摄像机保持固定角度，而不是跟随鼠标或手柄的输入。
	 ** 第一人称摄像机：
	 *** 通常设置为 true，因为第一人称摄像机需要完全跟随玩家控制器的旋转，模拟玩家的视角。
	 */
	TopDownCameraComponent->bUsePawnControlRotation = false;
	//将角色自身的旋转控制设置未false,当你设置这些属性为 false 时，角色的旋转将不会受到控制器的影响
	bUseControllerRotationPitch = false;
	bUseControllerRotationYaw = false;
	bUseControllerRotationRoll = false;

}


void APlayerCharacter::BeginPlay()
{
	Super::BeginPlay();
	
}

void APlayerCharacter::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
}

